﻿
namespace SistemaLogistica.DataAccess
{
    using System.Collections.Generic;
    using SistemaLogistica.Business.Entities;
    using System.Data;
    using System.Data.Common;

    public class UnidadMedidiaData : BaseDataAccess
    {
        private UnidadMedidiaData() { }

        private readonly static UnidadMedidiaData instancia = new UnidadMedidiaData();

        public static UnidadMedidiaData Instancia
        {
            get { return instancia; }
        }
       
        public List<UnidadMedidia> Listar()
        {
            List<UnidadMedidia> unidadMedidas = new List<UnidadMedidia>();
            DbCommand command = db.GetStoredProcCommand("GetAllFromUnidadMedidia");
            IDataReader dr = db.ExecuteReader(command);
            while (dr.Read())
            {
                unidadMedidas.Add(new UnidadMedidia
                {
                    IdUnidadMedida = dr.GetInt32(dr.GetOrdinal("IdUnidadMedida")),
                    Nombre = dr.GetString(dr.GetOrdinal("Nombre")),
                    Abreviatura = dr.GetString(dr.GetOrdinal("Abreviatura")),
                    Descripcion = dr.GetString(dr.GetOrdinal("Descripcion")),
                    EsUnidadBase = dr.GetBoolean(dr.GetOrdinal("EsUnidadBase"))

                });
            }
            return unidadMedidas;
        }

        public List<UnidadMedidia> Buscar(string nombre)
        {
            List<UnidadMedidia> unidadMedidas = new List<UnidadMedidia>();
            DbCommand command = db.GetStoredProcCommand("GetUnidadMedidaByKeyWord");
            db.AddInParameter(command, "nombre", DbType.String, nombre);
            IDataReader dr = db.ExecuteReader(command);
            while (dr.Read())
            {
                unidadMedidas.Add(new UnidadMedidia
                {
                    IdUnidadMedida = dr.GetInt32(dr.GetOrdinal("IdUnidadMedida")),
                    Nombre = dr.GetString(dr.GetOrdinal("Nombre")),
                    Abreviatura = dr.GetString(dr.GetOrdinal("Abreviatura")),
                    Descripcion = dr.GetString(dr.GetOrdinal("Descripcion")),
                    EsUnidadBase = dr.GetBoolean(dr.GetOrdinal("EsUnidadBase"))

                });
            }
            return unidadMedidas;
        }
        
        public UnidadMedidia ObtenerPorID(int id)
        {
            UnidadMedidia unidadMedida = null;
            DbCommand command = db.GetStoredProcCommand("GetUnidadMedidaByID");
            db.AddInParameter(command, "id", DbType.Int32, id);
            IDataReader dr = db.ExecuteReader(command);
            while (dr.Read())
            {
                unidadMedida =new UnidadMedidia
                {
                    IdUnidadMedida = dr.GetInt32(dr.GetOrdinal("IdUnidadMedida")),
                    Nombre = dr.GetString(dr.GetOrdinal("Nombre")),
                    Abreviatura = dr.GetString(dr.GetOrdinal("Abreviatura")),
                    Descripcion = dr.GetString(dr.GetOrdinal("Descripcion")),
                    EsUnidadBase = dr.GetBoolean(dr.GetOrdinal("EsUnidadBase"))

                };
            }
            return unidadMedida;
        }

        public UnidadMedidia ObtenerPorNombre(string nombre)
        {
            UnidadMedidia unidadMedida = null;
            DbCommand command = db.GetStoredProcCommand("GetUnidadMedidaByNombre");
            db.AddInParameter(command, "nombre", DbType.String, nombre);
            IDataReader dr = db.ExecuteReader(command);
            while (dr.Read())
            {
                unidadMedida = new UnidadMedidia
                {
                    IdUnidadMedida = dr.GetInt32(dr.GetOrdinal("IdUnidadMedida")),
                    Nombre = dr.GetString(dr.GetOrdinal("Nombre")),
                    Abreviatura = dr.GetString(dr.GetOrdinal("Abreviatura")),
                    Descripcion = dr.GetString(dr.GetOrdinal("Descripcion")),
                    EsUnidadBase = dr.GetBoolean(dr.GetOrdinal("EsUnidadBase"))

                };
            }
            return unidadMedida;
        }

        public UnidadMedidia ObtenerMedidaBase()
        {
            UnidadMedidia unidadMedida = null;
            DbCommand command = db.GetStoredProcCommand("GetUnidadMedidaBase");
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    unidadMedida = new UnidadMedidia
                    {
                        IdUnidadMedida = dr.GetInt32(dr.GetOrdinal("IdUnidadMedida")),
                        Nombre = dr.GetString(dr.GetOrdinal("Nombre")),
                        Abreviatura = dr.GetString(dr.GetOrdinal("Abreviatura")),
                        Descripcion = dr.GetString(dr.GetOrdinal("Descripcion")),
                        EsUnidadBase = dr.GetBoolean(dr.GetOrdinal("EsUnidadBase")),
                    };
                }
            }
            return unidadMedida;
        }

        public int Agregar(UnidadMedidia unidadMedida)
        {
            DbCommand command = db.GetStoredProcCommand("InsertUnidadMedidia");
            db.AddInParameter(command, "abreviatura", DbType.String, unidadMedida.Abreviatura);
            db.AddInParameter(command, "descripcion", DbType.String, unidadMedida.Descripcion);
            db.AddInParameter(command, "esUnidadBase", DbType.Boolean, unidadMedida.EsUnidadBase);
            db.AddOutParameter(command, "idUnidadMedida", DbType.Int16, 11);
            db.AddInParameter(command, "nombre", DbType.String, unidadMedida.Nombre);
      
            int result = db.ExecuteNonQuery(command);

            if (result != 0) return 1;
            else return 0;
        }

        public void Modificar(UnidadMedidia unidadMedida)
        {
            DbCommand command = db.GetStoredProcCommand("UpdateUnidadMedidia");
            db.AddInParameter(command, "abreviatura", DbType.String, unidadMedida.Abreviatura);
            db.AddInParameter(command, "descripcion", DbType.String, unidadMedida.Descripcion);
            db.AddInParameter(command, "esUnidadBase", DbType.Boolean, unidadMedida.EsUnidadBase);
            db.AddInParameter(command, "idUnidadMedida", DbType.Int16,unidadMedida.IdUnidadMedida);
            db.AddInParameter(command, "nombre", DbType.String, unidadMedida.Nombre);
            int result = db.ExecuteNonQuery(command);

        }

        public void Eliminar(int idUnidadMedidia)
        {
            DbCommand command = db.GetStoredProcCommand("DeleteUnidadMedidia");
            db.AddInParameter(command, "idUnidadMedida", DbType.Int16,idUnidadMedidia);
            db.ExecuteNonQuery(command);
        }
    }
}
